package space

import (
	"fmt"

	. "gitee.com/night-tc/gobige/entity"
	"gitee.com/night-tc/gobige/global"
	"gitee.com/night-tc/gobige/logger"
	"gitee.com/night-tc/gobige/space/pathfinder"
	"gitee.com/night-tc/gobige/timerwheel"
)

///////////////////////////////////////////////////////////////
/* 生命周期函数，子类可重载 */

/*
在创建对象的时候调用
eid:实例的唯一ID
etype:实例对象类型
dbid:实例持久化的唯一ID，如果没有持久化可以使用eid一样,也可以为0
realPtr:最外面的实例对象引用
spacePtr:最外面的实例所在空间的引用
fly:是否需要在redis中注册路由信息
*/
func (this *Space) OnCreated(etype string, eid, dbid uint64, realPtr IEntity, spacePtr IEntities, fly bool, param ...interface{}) error {
	err := this.SimpleEntity.OnCreated(etype, eid, dbid, realPtr, spacePtr, fly, param...)
	if err != nil {
		return err
	}
	this.Entities = NewEntities(false, this.realPtr, spacePtr.GetThreadGo())
	this.realPtr = realPtr.(ISpace)

	this.Timer = timerwheel.NewTimer()
	return nil
}

// 初始化
func (this *Space) Init() (err error) {
	if err = this.Entities.Init(); err != nil {
		return err
	}
	/*
		还需要初始化nvamash
		还有9宫格
	*/
	this.PathFindermgr = pathfinder.GetMeshMgr().GetFinder(this.MapName, this.MapKey)
	if this.PathFindermgr == nil {
		return ErrSp_Navmash_Nil.NewErr(nil, this.MapName, this.MapKey)
	}
	if err = this.SimpleEntity.Init(); err != nil {
		return err
	}

	this.StartTime = global.GetSrvInst().GetNowTime()
	this.SetNowTime(this.StartTime)
	return nil
}

// 循环调用
func (this *Space) Loop() {
	this.SimpleEntity.Loop()

}

// 循环调用中
func (this *Space) Looping() {
	this.Timer.OnTick(this.GetNowTime())
	this.Entities.Loop()
}

// 循环调用后
func (this *Space) Looped() {
	this.DelayCallHost.Exec()
}

// 销毁
func (this *Space) Destroy() {
	this.Entities.Destroy()
	this.SimpleEntity.Destroy()
	this.Timer.DeleteAllTimerTask()
	this.Timer.Stop()
	this.PathFindermgr.Destroy()
}

// 发生Panic的时候，做的处理
func (this *Space) OnPanic(err error) {
	// 如果在处理过程中，还有crash，那就直接return，不做其他处理
	if this.GetEntityState() == Entity_State_Destroy && this.GetEntityState() == Entity_State_Invalid {
		return
	}
	logger.Errorf("the Space OnPanic !")
}

/* 生命周期函数，子类可重载 */
///////////////////////////////////////////////////////////////
/* 其他接口 */

func (this *Space) String() string {
	return fmt.Sprintf("[%s MapID:%d MapName:%s]",
		this.SimpleEntity.String(), this.MapID, this.MapName)
}

/* 其他接口 */
///////////////////////////////////////////////////////////////
